/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.criterios;

import au.com.bytecode.opencsv.CSVReader;
import control.MessageFactory;
import control.UserBean;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
/**
 *
 * @author juampi
 */
public class PublicarNota {
    private UploadedFile file;
    private String codigoCriterio;
    private boolean enable;
    public PublicarNota(){
        enable=true;
    }
    public boolean isEnable(){
        return enable;
    }
    public void publicar(){
        try{

            ArrayList<Calificacion> cls=new ArrayList<Calificacion>();
            if(file.getName().endsWith(".csv")){
                cargarDeCvs(cls);
            }else if(file.getName().endsWith(".xls")){
                cargarDeXls(cls);
            }else{
            }
            GestorCriteriosDB.getInstance().guardarCalificaciones(cls);
            if(GestorCriteriosDB.getInstance().tieneSubcriterios(codigoCriterio)) {
                    FacesMessage message  = new FacesMessage("Se guardo pero puede ocasionar inconsistencias al ser un nodo intermedio","Se guardo pero puede ocasionar inconsistencias al ser un nodo intermedio");
                    FacesContext.getCurrentInstance().addMessage(null, message);
            }
        }catch(Exception e){
            try{
                 Scanner in = new Scanner(e.getMessage());
                while(in.hasNextLine()) {
                    FacesMessage mensaje = new FacesMessage(in.nextLine(),in.nextLine());
                    FacesContext.getCurrentInstance().addMessage(null, mensaje);
                }
            }catch(Exception ex) {

            }
            //JOptionPane.showMessageDialog(null,e.getMessage()
        }
    }
    public UploadedFile getFile(){return file;};
    public void setFile(UploadedFile f){file=f;}
    public String getCriterio(){return codigoCriterio;}
    public void setCriterio(String c){ codigoCriterio=c;}
    
     private void cargarDeXls(ArrayList<Calificacion> x){
            try{
                InputStream inp=file.getInputStream();
                HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));
                int n=wb.getNumberOfSheets();
                HSSFSheet ss=wb.getSheetAt(0);
                for(Row row : ss){
                    Iterator<Cell> cls=row.iterator();
                    String sis=toString(cls.next());
                    String nota=toString(cls.next());
                    x.add(new Calificacion(getUsuario().getCodigoCurso(),sis,codigoCriterio,nota));
                }
            }catch(Exception e){

            }
        }
        private void cargarDeCvs(ArrayList<Calificacion> x){
            try {
                CSVReader csvReader = new CSVReader(new InputStreamReader(file.getInputStream()   , "UTF-8"), CSVReader.DEFAULT_SEPARATOR, CSVReader.DEFAULT_QUOTE_CHARACTER, 1);
                List<String[]> myEntries = csvReader.readAll();
                for (String[] entry : myEntries) {
                    x.add(new Calificacion(getUsuario().getCodigoCurso(),entry[0],codigoCriterio,entry[1]));
                }
            } catch (Exception ex) {

            }
        }
        public ArrayList<SelectItem> getCriterios(){
            ArrayList<SelectItem> items=new ArrayList<SelectItem>();
            ArrayList<CriterioEvaluacion> cs=GestorCriteriosDB.getInstance().listarCriteriosEspacio(getUsuario().getCodigoCurso());
            for(CriterioEvaluacion c : cs){
                items.add(new SelectItem(c.getCodigoCriterio(),c.getNombreCriterio()));
            }
            if(items.isEmpty()){
                enable=false;
                FacesMessage mensaje=new FacesMessage("No cuenta con ningun criterio de calificacion configurado correctamente","No cuenta con ningun criterio de calificacion configurado correctamente");
                FacesContext.getCurrentInstance().addMessage(null, mensaje);
            }
            return items;
        }
    private String toString(Cell cell){
    String res="";
    switch(cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            res+=cell.getRichStringCellValue().getString();
            break;
        case Cell.CELL_TYPE_NUMERIC:
            if(DateUtil.isCellDateFormatted(cell)) {
            res+=cell.getDateCellValue().toString();
            } else {
            res+= (int)cell.getNumericCellValue();
            }
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            res+=cell.getBooleanCellValue();
        break;
        case Cell.CELL_TYPE_FORMULA:
            res+=cell.getCellFormula();
            break;
        default:
    }
    return res;
    }
    public UserBean getUsuario(){
        FacesContext facesContext = FacesContext.getCurrentInstance();
        VariableResolver vr = facesContext.getApplication().getVariableResolver();
        UserBean user = (UserBean)vr.resolveVariable(facesContext, "userBean");
        return user;
    }
    public void verificarCriterio(ValueChangeEvent cve){
        
        String codigoC = (String)cve.getNewValue();
        CriterioEvaluacion ce= GestorCriteriosDB.getInstance().recuperarCriterioEvaluacion(codigoC);
        if(ce.getSubcriterios().size()>0) {
            FacesMessage mensaje = MessageFactory.createMessage(FacesMessage.SEVERITY_ERROR, "mensajeAdvertenciaNodoIntermedio", "");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
        if(ce.getCriterioCalificacion()==null) {
            FacesMessage mensaje = new FacesMessage("El criterio de evaluacion que ha seleccionado no tiene asignado un criterio de calificacion por lo cual no subira las notas.", "El criterio de evaluacion que ha seleccionado no tiene asignado un criterio de calificacion por lo cual no subira las notas.");
            FacesContext.getCurrentInstance().addMessage(null, mensaje);
        }
    }
}
